package com.hbzhit.common.controller;

import com.hbzhit.common.utils.EnumUtils;
import com.hbzhit.common.utils.R;
import com.hbzhit.config.CacheConfig;
import com.hbzhit.modules.sys.entity.SysConfigEntity;
import com.hbzhit.modules.sys.entity.SysDictEntity;
import com.hbzhit.modules.sys.entity.SysDictValEntity;
import com.hbzhit.modules.sys.entity.SysOrgEntity;
import com.hbzhit.modules.sys.service.SysConfigService;
import com.hbzhit.modules.sys.service.SysDictService;
import com.hbzhit.modules.sys.service.SysDictValService;
import com.hbzhit.modules.sys.service.SysOrgService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 公共API
 *
 * @author DING
 * @date 2019-07-12 19:07:15
 */
@Api(tags = {"公共API"})
@RestController
@RequestMapping("/comm")
@AllArgsConstructor
public class CommonController {

    private final SysConfigService sysConfigService;
    private final SysOrgService orgService;
    private final SysDictService sysDictService;
    private final SysDictValService sysDictValService;
    private final CacheConfig cacheConfig;

    @ApiOperation(value = "获取枚举数据", notes = "获取枚举数据")
    @GetMapping("/enums/")
    public R getEnums() {
        Map<String, Object> enumOptions = EnumUtils.enumsToOptions();
        return R.ok(enumOptions);
    }

    /**
     * 获取系统参数，此参数在参数管理节点配置
     */
    @ApiOperation(value = "获取系统参数列表", notes = "获取系统参数列表，此参数在参数管理节点配置")
    @GetMapping("/config/list")
    public R<List<SysConfigEntity>> getConfigList(){
        List<SysConfigEntity> list = sysConfigService.list();

        return R.ok(list);
    }

    /**
     * 获取系统参数，此参数在参数管理节点配置
     * @return
     */
    @ApiOperation(value = "根据参数名获取系统参数值", notes = "根据系统参数名称获取系统参数值，此参数在参数管理节点配置")
    @GetMapping("/config/{paramKey}")
    public R<Object> getConfig(@NotNull @ApiParam(value = "参数名称", required = true) @PathVariable String paramKey) {
        String value = sysConfigService.getValue(paramKey);

        return R.ok().data(value);
    }


    /**
     * 组织机构档案（全部）
     */
    @ApiOperation(value = "组织机构档案（全部）")
    @GetMapping("/org/all")
    public R<List<SysOrgEntity>> orgAll() {
        List<SysOrgEntity> list = orgService.listAll();

        return R.ok(list);
    }

    /**
     * 数据字典档案（全部）
     */
    @ApiOperation(value = "数据字典档案（全部）")
    @GetMapping("/dict/all")
    public R<List<SysDictEntity>> dictAll() {
        List<SysDictEntity> dictList = sysDictService.listAll();
        List<SysDictValEntity> valList = sysDictValService.listAll();

        dictList.forEach(dict -> {
            List<SysDictValEntity> list = new ArrayList<>();
            valList.forEach(val -> {
                if (dict.getId().equals(val.getDictId())) {
                    list.add(val);
                }
            });
            dict.setValList(list);
        });

        return R.ok(dictList);
    }

    /**
     * 更新后台数据缓存
     */
    @ApiOperation("更新后台数据缓存")
    @GetMapping("/updateCache")
    public R updateCache() {
        cacheConfig.createCache();
        return R.ok("更新后台数据缓存成功");
    }

}
